Git wijzigingen terugdraaien
Home

Git wijzigingen terugdraaien

Git wijzigingen terugdraaien

Bron

Undoing Changes

git revert

Het git revert commando maakt een neergelegde momentopname (commit) ongedaan. Maar doe commit wordt niet verwijderd uit de geschiedenis van het project. Git maakt de wijzigingen ongedaan die door de commit werden aangebracht en voegt een nieuwe commit toe waarin het resultaat staat van deze operatie. Op die manier gaat er niets uit de geschiedenis van je project verloren, wat belangrijk is voor de integriteit van je revisiegeschiedenis en voor een betrouwbare samenwerking.

Git - Revert
Git - Revert

Wat hier aan voorafgaat

De toestand van de myap werkmap en de repo is zoals ze is nadat je de voorbeelden in Git vorige versies inspecteren hebt gemaakt.

We hebben de volgende commit geschiedenis:

C:\myap>git log --oneline
9af1508 Vera eerste versie hersteld
f2afd87 Vondel eerste versie toegevoegd
76367c9 Vera derde versie
ac43111 Vera tweede versie
b3a2046 Vera eerste versie

In de praktijk

git revert <commit>

Genereer een nieuwe commit, die alle wijzigingen, die in de <commit> zijn aangebracht, ongedaan maakt en pas dat toe op in de gebruik zijnde tak.

Dit is de toestand in de werkmap nu:

C:\myap>dir
 Volume in drive C is Windows
 Volume Serial Number is C6F4-3FE3

 Directory of C:\myap

26/01/2017  12:19    <DIR>          .
26/01/2017  12:19    <DIR>          ..
25/01/2017  14:39                14 .gitignore
26/01/2017  12:19                83 Vera.txt
26/01/2017  12:19               265 Vondel.txt
               3 File(s)            362 bytes
               2 Dir(s)  100 490 403 840 bytes free

C:\myap>type Vera.txt
Ambrosia, wat vloeit mij aan?
uw schedelveld is koeler maan
en alle appels blozen
C:\myap>

We willen terugkeren naar de commit van f2afd87 Vondel eerste versie toegevoegd:

Je wordt gevraagd een commit boodschap op te geven indien je er geen hebt meegegeven. Accepteer de opgegeven boodschap, sla die op en verlaat de editor met Esc Z Z.

En dat is de toestand in werkmap nu:

C:\myap>git log --oneline
9af1508 Vera eerste versie hersteld
f2afd87 Vondel eerste versie toegevoegd
76367c9 Vera derde versie
ac43111 Vera tweede versie
b3a2046 Vera eerste versie

C:\myap>git revert f2afd87
[master 7b57a41] Revert "Vondel eerste versie toegevoegd"
 1 file changed, 11 deletions(-)
 delete mode 100644 Vondel.txt

C:\myap>dir
 Volume in drive C is Windows
 Volume Serial Number is C6F4-3FE3

 Directory of C:\myap

28/01/2017  12:54    <DIR>          .
28/01/2017  12:54    <DIR>          ..
25/01/2017  14:39                14 .gitignore
26/01/2017  12:19                83 Vera.txt
               2 File(s)             97 bytes
               2 Dir(s)  100 488 675 328 bytes free

C:\myap>type Vera.txt
Ambrosia, wat vloeit mij aan?
uw schedelveld is koeler maan
en alle appels blozen

C:\myap>git log --oneline
7b57a41 Revert "Vondel eerste versie toegevoegd"
9af1508 Vera eerste versie hersteld
f2afd87 Vondel eerste versie toegevoegd
76367c9 Vera derde versie
ac43111 Vera tweede versie
b3a2046 Vera eerste versie

We beklagen ons de laatste revert en willen die ongedaan maken:

C:\myap>git revert 7b57a41
[master eae692f] Revert "Revert "Vondel eerste versie toegevoegd""
 1 file changed, 11 insertions(+)
 create mode 100644 Vondel.txt

C:\myap>dir
 Volume in drive C is Windows
 Volume Serial Number is C6F4-3FE3

 Directory of C:\myap

28/01/2017  13:09    <DIR>          .
28/01/2017  13:09    <DIR>          ..
25/01/2017  14:39                14 .gitignore
26/01/2017  12:19                83 Vera.txt
28/01/2017  13:09               265 Vondel.txt
               3 File(s)            362 bytes
               2 Dir(s)  100 487 270 400 bytes free

C:\myap>type vera.txt
Ambrosia, wat vloeit mij aan?
uw schedelveld is koeler maan
en alle appels blozen
C:\myap>type Vondel.txt
Joost van den Vondel
Geuze-Vesper of Ziekentroost voor de Vierenentwintig

Had hij Holland dan gedragen,
Onder 't hart,
Tot zijn afgeleefde dagen,
Met veel smart,
Om 't meinedig zwaard te laven,
Met zijn bloed,
En te mesten kraai en raven
Op zijn goed ?

C:\myap>

Terugdraaien (revert) doe je wanneer je alle wijzigingen van één commit wilt verwijderen een hele plegen van je projectgeschiedenis. Dit kan handig zijn, bijvoorbeeld, als alleen de wijzigingen sinds de laatste commit wilt ongedaan maken. In plaats van dat manueel te doen en een nieuwe commit uit te voeren, die je gewoon een git revert om dat automatisch te laten gebeuren.

Het is belangrijk in te zien dat een git revert slechts de wijzigingen van één enkele commit ongedaan maakt en dus niet terugkeert naar de vorige toestand van het project door alle daarop volgende commits te verwijderen. Dat is immers een git reset (Git wijzigingen ongedaan maken).

Een visuele voorstelling van het verschil tussen revert en reset:

Git - Revert
Git - revert visuele voorstelling
Git - reset visual presentation
Git - reset visuele presentatie

Revert is om twee redenen beter dan reset:

  1. Revert verandert de geschiedenis van het project niet. Op die manier is het veiliger voor commits die al gepubliceerd zijn in een gedeelde repository.
  2. Revert kan uitgevoerd worden van om het even welke commit in de geschiedenis van het project. Reset kan alleen terugkeren naar een vorige commit vertrekkende van de laaste. Als je een oudere commit zou willen verwijderen met git reset, moet je eerst de commits, die na deze oudere commit hebben plaatsgevonden, verwijderen en alle daaropvolgende commits opnieuw neerleggen.

Ik wil nu de derde versie van Vera.txt terughalen omdat die de meest volledige is. Daarvoor gebruiken we git checkout <commit> <file> (zie daarvoor Git vorige versies inspecteren).

C:\myap>git log --oneline
eae692f Revert "Revert "Vondel eerste versie toegevoegd""
7b57a41 Revert "Vondel eerste versie toegevoegd"
9af1508 Vera eerste versie hersteld
f2afd87 Vondel eerste versie toegevoegd
76367c9 Vera derde versie
ac43111 Vera tweede versie
b3a2046 Vera eerste versie

C:\myap>git checkout 76367c9 Vera.txt

C:\myap>type Vera.txt
Jan Engelman
Vera Janacopoulos
Cantilene

Ambrosia, wat vloeit mij aan?
uw schedelveld is koeler maan
en alle appels blozende klankgazelle die ik vond hoe zoete
zoele kindermond van zeeschuim en van rozen

C:\myap>

Tenslotte voegen we alle wijzigingen in de werkmap toe op de verzamelplaats en leggen we die neer in de bewaarplaats:

C:\myap>git add --all

C:\myap>git commit -m "Vondel en Engelman meest volledig"
[master 44430ac] Vondel en Engelman meest volledig
 2 files changed, 9 insertions(+), 1 deletion(-)
 create mode 100644 .gitignore

C:\myap>

JI
2017-01-29 14:50:21